﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HerGoS.Viaticos.Entities;
using HerGoS.DAO;
using HerGoS.Interfaces;
using System.Data;
using HerGoS.Viaticos.Exceptions;
using HerGoS.Administration.Entities;
using HerGoS.Administration.Engine;

namespace HerGoS.Viaticos.Engine
{
   public class GestorGasto
    {
       public static Gastos Obtener(int oid)
       {
           try
           {
               IRepository repo = RepositoryFactory.Create(Config.RepositoryViaticosName);
               repo.Nombre = "GASTOS_SP";
               repo.AddParameter("@ACCION", "BYID");
               repo.AddParameter("@ID", oid);
               DataTable dt = repo.ExecuteDataTable();
               Gastos result = dt.ToGenericList<Gastos>(GastosConverter).FirstOrDefault();
               return result;
           }
           catch (Exception ex)
           {
               throw new GastosGetException(ex);
           }
       }

       public static void Guardar(List<Gastos> ListaGastos, int idLiquidacion)
       {

           foreach (Gastos g in ListaGastos)
           {
               Guardar(g, idLiquidacion);
           }
       }
       public static void Guardar(Gastos gasto)
       {
           Guardar(gasto, 0);
       }
       public static void Guardar(Gastos gasto, int idLiquidacion)
       {
           try
           {
               IRepository repo = RepositoryFactory.CreateTransactional(Config.RepositoryViaticosName);
               repo.Nombre = "GASTOS_PROC";
               repo.AddParameter("@ACCION ", gasto.Persistencia);
               repo.AddParameter("@ID", gasto.OID);
               repo.AddParameter("@IDLIQUIDACION", (idLiquidacion == 0) ? null : (int?)idLiquidacion);
               repo.AddParameter("@NUMERO", gasto.Numero);
               repo.AddParameter("@FECHA", gasto.FechaGasto);
               repo.AddParameter("@CUIT", gasto.Cuit);
               repo.AddParameter("@IDTIPOCONCEPTO", gasto.TipoConcepto == null ? (int?) null : gasto.TipoConcepto.OID );
               repo.AddParameter("@CONCEPTO", gasto.Concepto);
               repo.AddParameter("@MONTO", gasto.MontoGasto);
               repo.AddParameter("@IDUSUARIO", HGSContext.Usuario.OID);
               gasto.OID = repo.ExecuteReturnValue().ToInteger();
               repo.Commit();

               GestorBitacora.Guardar(gasto);
           
           }
           catch (Exception ex)
           {
               throw new GastosSaveException(ex);
           }
       }

       public static void Eliminar(Gastos gasto)
       {
           gasto.Persistencia = EstadoPersistencia.DELETE;
           Guardar(gasto);
           gasto.Persistencia = EstadoPersistencia.UPDATE;
           gasto.Activo = false;
       }


       public static void ReActivar(Gastos gasto)
       {
           gasto.Persistencia = EstadoPersistencia.UNDELETE;
           Guardar(gasto);
           gasto.Persistencia = EstadoPersistencia.UPDATE;
           gasto.Activo = true;
       }

       public static List<Gastos> Consultar(Liquidacion liquidacion)
       {
           try
           {
               IRepository repo = RepositoryFactory.Create(Config.RepositoryViaticosName);
               repo.Nombre = "GASTOS_SP";
               repo.AddParameter("@ACCION", "CONSULTA");
               repo.AddParameter("@ID", null);
               repo.AddParameter("@IDLIQUIDACION", liquidacion.OID);
               repo.AddParameter("@ACTIVO", true);
               DataTable dt = repo.ExecuteDataTable();
               List<Gastos> result = dt.ToGenericList<Gastos>(GastosConverter);
               return result;

           }
           catch (Exception ex)
           {
               throw new SolicitudGetException(ex);
           }
       }


       //public static List<Gastos> Consultar()
       //{
       //    return Consultar(new Gastos { Activo = true });
       //}


       public static List<Gastos> Activos(Liquidacion entidad)
       {
           try
           {
               return entidad.LGastos.Where(x => x.Persistencia != EstadoPersistencia.DELETE).ToList();
           }
           catch (Exception ex)
           {
               throw new TramoGetException(ex);
           }
       }

       #region Converter

       public static Gastos GastosConverter(DataRow row)
       {
           Gastos Gasto = new Gastos
           {
               OID = row["gasID"].ToInteger(),
               Persistencia = EstadoPersistencia.UPDATE,
               Numero = row["gasNUMERO"].ToString(),
               FechaGasto = row["gasFECHA"].ToDateTime(),
               Cuit =  row["gasCUIT"].ToString(),
               TipoConcepto = GestorTipoConcepto.Obtener(row["gasIDTIPOCONCEPTO"].ToInteger()),
               Concepto = row["gasCONCEPTO"].ToString(),
               MontoGasto = row["gasMONTO"].ToDecimal(),
               Activo = row.IsNull("FECHA_BAJA") ? true : false
           };

           return Gasto;
       }
       #endregion

    }
}
